package com.ziJing.multithreading.visibility;

import com.ziJing.multithreading.helper.SleepHelper;

/**
 * @program Multithreading
 * @description:
 *  volatile 修饰 引用类型（包括数组）只能保证引用本身的可见性，不能保证内部字段的可见性
 * @author: zhangbo
 * @create: 2022/04/26 23:00
 */
public class VolatileReference {

    private static class A {

        //一定要在这里加 volatile ，而不是下面
        boolean running = true;

        void m(){
            System.out.println("m start");
            while (running){

            }
            System.out.println("m end!");
        }
    }

    /**
     * 这里加 volatile 是不行的，
     * volatile 修饰 引用类型（包括数组）只能保证引用本身的可见性，不能保证内部字段的可见性
     */
    private volatile static A a = new A();

    public static void main(String[] args) {
        new Thread(a::m, "t1").start();
        SleepHelper.sleepSeconds(1);
        a.running = false;
    }
}
